package com.crm.system.service.cluePoolManager;

import com.alibaba.fastjson.JSONObject;
import com.crm.common.model.DhPageInfo;
import com.crm.model.entity.cluePoolManager.Clue;
import com.crm.model.qo.cluePoolManager.ClueExtentQO;
import com.crm.model.qo.cluePoolManager.ClueQO;
import com.crm.model.qo.cluePoolManager.ClueSeniorQO;
import com.crm.model.vo.cluePoolManager.ClueEditVO;
import com.crm.model.vo.cluePoolManager.ClueVO;

import com.crm.model.qo.cluePoolManager.ClueAddQO;
import com.crm.model.vo.cluePoolManager.UserCompanyVO;
import com.crm.model.vo.customerManager.QccSearchWideVO;

import java.text.ParseException;
import java.util.List;
import java.util.Map;

/**
 * @Author yincuimei
 * @Date 2021/1/6 16:55
 */
public interface ClueService {

    /**
     * 线索公海--查看线索清单(私有池、分公司公有池、全国公有池的线索)
     * @param clueQO        ---普通搜索条件
     * @param clueSeniorQO  ---高级搜索条件(包括行业、成立年限、注册资本、企业类型、参保人数、有无联系电话、有无联系人、有无联系邮箱)
     * @param pageIndex     ---页码
     * @param pageSize      ---分页大小
     * @param sortName      ---排序列名
     * @param sortOrder     ---排序规则(ASC/DESC)
     * @return
     */
    DhPageInfo<ClueVO> selectPublicPoolClueList(ClueQO clueQO,ClueSeniorQO clueSeniorQO,Integer pageIndex, Integer pageSize, String sortName, String sortOrder);

    /**
     * 线索公海--查看线索清单(个人池的线索)
     * @param clueQO        ---普通搜索条件
     * @param clueSeniorQO  ---高级搜索条件(包括行业、成立年限、注册资本、企业类型、参保人数、有无联系电话、有无联系人、有无联系邮箱)
     * @param pageIndex     ---页码
     * @param pageSize      ---分页大小
     * @param sortName      ---排序列名
     * @param sortOrder     ---排序规则(ASC/DESC)
     * @return
     */
    DhPageInfo<ClueVO> selectPrivatePoolClueList(ClueQO clueQO,ClueSeniorQO clueSeniorQO,Integer pageIndex, Integer pageSize, String sortName, String sortOrder);

    /**
     * 新增线索
     * @param clueAddQO
     * @return
     */
    int addClue(ClueAddQO clueAddQO);


    /**
     * 线索--分配
     * @param distributeUserId  ---分配人员ID
     * @param clueId            ---线索主键
     * @param poolId            ---线索池ID
     * @return
     */
    Map<String,Object> updateClueDistribute(String distributeUserId,String clueId,String poolId);

    /**
     * 线索--收回
     * @param clueQO
     * @return
     */
    void retrieveClue(ClueQO clueQO);

    /**
     * 线索--删除
     * @param clueQO  ---线索
     * @return
     */
    Boolean deleteClueById(ClueQO clueQO);

    /**
     * 管理系统--批量删除线索(将delete_status置为1)
     * @param clueIds
     * @return
     */
    Boolean batchDeleteClueByClueIds(List clueIds);

    /**
     * 线索池删除时根据线索池ID查询该线索池里线索的已分配和已领取总数
     * @param cluePoolPublicId ---线索池ID
     * @return
     */
    long selectDistributedOrReceiveCount(String cluePoolPublicId);

    /**
     * 根据线索池ID查询公司
     * @param cluePollId  ---线索池ID
     * @return
     */
    List<UserCompanyVO>  selectDistributeCompany(String cluePollId);

    /**
     * 根据用户名查询用户信息及所在公司信息(全国公有池、分公司公有池-分配-按人员姓名模糊查找)
     * @param userName ---用户名
     * @return
     */
    List<UserCompanyVO> selectUserAndCompany(String userName);

    /**
     * 查询分公司公有池的用户
     * @param companyIds ---公司ID集合
     * @return
     */
    List<UserCompanyVO> selectUserByPoolPermission(List<String> companyIds,String userName);

    /**
     * 编辑线索
     * @param clue
     * @return
     */
    int editClue(Clue clue);

    /**
     * 线索池详情-线索清单-查看
     * 根据线索ID查询线索信息
     * @param clueId
     * @return
     */
    ClueEditVO selectClueByClueId(String clueId);

    /**
     * @author wll
     * info 线索池公海-线索清单
     */
    DhPageInfo<ClueVO> selectClueInfo(ClueQO clueQO, Integer pageIndex, Integer pageSize, String sortName, String sortOrder);

    /**
     *info 用户模块-我的线索池-线索清单
     * @return
     */
    DhPageInfo<ClueVO> getMyClueList(ClueQO clueQOclueQO, ClueExtentQO clueExtentQO, Integer pageIndex, Integer pageSize, String sortName, String sortOrder);

    /**
     * @author wll
     * info 我的线索池-线索清单释放
     * @param clueQO
     * @return
     */
    void releaseClue(ClueQO clueQO);

    /**
     * @author wll
     * info 线索池公海-线索表单-领取
     * @param clueQO
     * @return
     */
    JSONObject receiveClue(ClueQO clueQO, String poolId);

    /**
     * 查询用户模块-我的线索池-线索清单-线索池线索数
     * @param cluePoolPrivateId
     * @return
     */
    long selectCluePoolPrivateCount(String cluePoolPrivateId);

    /**
     * 管理端数据统计——根据公共线索池id查询公共池子线索数量
     * @param cluePoolPublicId
     * @return
     */
    long selectClueCountByPublicPoolId(String cluePoolPublicId);

    /**
     * 线索0次领取数量
     * @param cluePoolId
     * @return
     */
    long clueZeroTimeReceiveCount(String cluePoolId);

    /**
     * 线索总转化数
     * @param cluePoolPublicId  线索池公有id
     * @return
     */
    long selectClueConverCountByPublicPoolId(String cluePoolPublicId);


    /**
     * 获取一个线索
     * @return
     */
    Clue selectOneClue();

    /***
     * @Description: 获取线索每月转换数量
     * @Param: cluePoolId 线索池id
     * @Param: yearMonth 年月
     * @Author: luojie
     * @Date: 2021/5/13 14:45
     */
    long getCluePoolConversionStatisticsForOneMonth(String cluePoolId, String yearMonth) throws ParseException;

    /**
     * 企查查验证
     * @param customerName
     * @param unifiedSocialCreditCode
     * @return
     */
    String getVerification(String customerName,String unifiedSocialCreditCode);

    /**
     * @description 根据线索ID修改线索标签
     * @param tag 标签
     * @param clueId 线索ID
     * @author ChengYun
     * @date 2021年12月14日 下午 14:34:59
     */
    int updateUserClueTag(String tag, String clueId);
}
